home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1997-01-29 | 10.3 KB | 453 lines |
- 10 'RISESET - Sunrise/Sunset - 17 JUN 94 rev. 28 SEP 96
- 20 'based on DAYLIGHT program, HAM-SOFT disk# 1247
- 30 IF EX$=""THEN EX$="EXIT"
- 40 PROG$="riseset"
- 50 COMMON EX$,BASEONLY,PROG$
- 60 BASEONLY=1 'lat/long database
- 70 '
- 80 CLS:KEY OFF
- 90 COLOR 7,0,1
- 100 UL$=STRING$(80,205)
- 110 DIM M$(12)
- 120 AM$=" a.m.":PM$=" p.m."
- 130 PI=3.14159
- 140 '
- 150 DATA Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
- 160 FOR Z=1 TO 12:READ M$(Z):NEXT Z
- 170 '
- 180 '.....start
- 190 CLS
- 200 COLOR 15,2
- 210 PRINT " SUNRISE / SUNSET";TAB(57);"by George Murphy VE3ERP ";
- 220 COLOR 1,0:PRINT STRING$(80,223);
- 230 COLOR 7,0
- 240 '
- 250 T=6:Q$=CHR$(34)
- 260 PRINT TAB(T);
- 270 PRINT "This program calculates sunrise and sunset times anywhere on earth"
- 280 PRINT TAB(T);
- 290 PRINT "by entering the latitude and longitude of the desired location."
- 300 PRINT
- 310 PRINT TAB(T);
- 320 PRINT "You can find the latitude and longitude of many places in the"
- 330 PRINT TAB(T);
- 340 PRINT "world by running HAMCALC's ";Q$;"LATITUDE/LONGITUDE DATA BASE";Q$;
- 350 PRINT " program."
- 360 PRINT
- 370 COLOR 0,7:LOCATE CSRLIN,T
- 380 PRINT " Press 1 to continue or 0 to EXIT....."
- 390 COLOR 7,0
- 400 Z$=INKEY$:IF Z$=""THEN 400
- 410 IF Z$="0"THEN CLS:RUN EX$
- 420 IF Z$="1"THEN 450
- 430 GOTO 400
- 440 '
- 450 LOCATE CSRLIN-1
- 460 PRINT TAB(T);
- 470 PRINT "This program requires entry of latitude and longitude in decimal"
- 480 PRINT TAB(T);
- 490 PRINT "degrees. If you wish to convert degrees/minutes/seconds values to"
- 500 PRINT TAB(T);
- 510 PRINT "decimal degrees, you can do so by running the LATITUDE/LONGITUDE"
- 520 PRINT TAB(T);
- 530 PRINT "DATA BASE program."
- 540 PRINT
- 550 COLOR 15,2:LOCATE CSRLIN,T
- 560 PRINT " Do you want to run the LATITUDE/LONGITUDE DATA BASE now? (y/n) "
- 570 COLOR 7,0
- 580 Z$=INKEY$
- 590 IF Z$="y"OR Z$="Y"THEN CLS:CHAIN"latlong"
- 600 IF Z$="n"OR Z$="N"THEN 630
- 610 GOTO 580
- 620 '
- 630 '.....inputs
- 640 VIEW PRINT 3 TO 23:CLS:VIEW PRINT:LOCATE 3
- 650 INPUT " ENTER: LATITUDE in decimal degrees ( minus if south )....";Z1
- 660 IF Z1<0 THEN Z1$="S"ELSE Z1$="N"
- 670 LAT=Z1*0.0174533
- 680 '
- 690 ZONE=ZON*PI/180
- 700 INPUT " ENTER: LONGITUDE in decimal degrees ( minus if west )....";X:Z2=-X
- 710 FOR Z=0 TO 12
- 720 IF ABS(Z2)>=Z*15-7.5 THEN ZON=Z*SGN(Z2)
- 730 NEXT Z
- 740 ZONE=ZON*15*PI/180
- 750 IF Z2<0 THEN Z2$="E"ELSE Z2$="W"
- 760 LONG=Z2*0.0174533
- 770 '
- 780 CLS
- 790 PRINT " LOCATION: (decimal degrees)";USING "####.##";ABS(Z1);:PRINT "<UNK! {00F8}>";Z1$;
- 800 PRINT USING"####.##";ABS(Z2);:PRINT "<UNK! {00F8}>";Z2$
- 810 PRINT UL$;
- 820 '
- 830 INPUT " ENTER: YEAR (yyyy)..................................";H
- 840 INPUT " ENTER: MONTH (1-12).................................";I
- 850 I$=M$(I)
- 860 INPUT " ENTER: DAY of month (1-31)..........................";J
- 870 LOCATE 1,56:PRINT "DATE: ";I$;J;H
- 880 '
- 890 '.....local standard time
- 900 VIEW PRINT 3 TO 24:CLS:VIEW PRINT:LOCATE 3
- 910 STC=-ZON 'solar time zone
- 920 PRINT " This location is in SOLAR TIME ZONE";USING "+##";STC;
- 930 PRINT " (UTC";USING "+##";STC;:PRINT " hours)"
- 940 PRINT
- 950 PRINT " PRESS letter in < > to describe the LOCAL STANDARD TIME ";
- 960 PRINT "in this zone:"
- 970 PRINT UL$;
- 980 L$="( local solar time "
- 990 PRINT " < a > UTC"; USING "+##";STC+2;:PRINT TAB(20);L$;"+2 hr.)"
- 1000 PRINT " < b > UTC"; USING "+##.#";STC+1.5;:PRINT TAB(20);L$;"+1 1/2 hr.)"
- 1010 PRINT " < c > UTC"; USING "+##";STC+1;:PRINT TAB(20);L$;"+1 hr.)"
- 1020 PRINT " < d > UTC"; USING "+##.#";STC+0.5;:PRINT TAB(20);L$;"+1/2 hr.)"
- 1030 '
- 1040 COLOR 0,7:LOCATE CSRLIN,2
- 1050 PRINT " < e > UTC"; USING "+##";STC+0;
- 1060 PRINT TAB(20)"( SAME AS LOCAL SOLAR TIME ) "
- 1070 COLOR 7,0
- 1080 '
- 1090 PRINT " < f > UTC"; USING "+##.#";STC-0.5;:PRINT TAB(20);L$;"-1/2 hr.)"
- 1100 PRINT " < g > UTC"; USING "+##";STC-1;:PRINT TAB(20);L$;"-1 hr.)"
- 1110 PRINT " < h > UTC"; USING "+##.#";STC-1.5;:PRINT TAB(20);L$;"-1 1/2 hr.)"
- 1120 PRINT " < i > UTC"; USING "+##";STC-2;:PRINT TAB(20);L$;"-2 hr.)"
- 1130 PRINT UL$;
- 1140 IF(STC>=-10)AND(STC<=10)THEN 1180
- 1150 PRINT TAB(15)"CALL"
- 1160 PRINT TAB(15)"CLSSOUND hours over 12 in this column refer to the time on"
- 1170 PRINT TAB(15)" the opposite side of the International Date Line."
- 1180 Z$=INKEY$:IF Z$=""THEN 1180
- 1190 IF Z$="a"THEN LST=2
- 1200 IF Z$="b"THEN LST=1.5
- 1210 IF Z$="c"THEN LST=1
- 1220 IF Z$="d"THEN LST=0.5
- 1230 IF Z$="e"THEN LST=0
- 1240 IF Z$="f"THEN LST=-0.5
- 1250 IF Z$="g"THEN LST=-1
- 1260 IF Z$="h"THEN LST=-1.5
- 1270 IF Z$="i"THEN LST=-2
- 1280 '
- 1290 '.....daylight saving
- 1300 VIEW PRINT 4 TO 24:CLS:VIEW PRINT:LOCATE 4
- 1310 PRINT UL$;
- 1320 PRINT " PRESS number in < > to describe DAYLIGHT SAVING TIME in this zone:"
- 1330 PRINT UL$;
- 1340 PRINT " < 1 > 1 hour ahead of Local Standard Time"
- 1350 PRINT " < 2 > 2 hours ahead of Local Standard Time"
- 1360 PRINT
- 1370 PRINT " < 0 > Not Applicable"
- 1380 Z$=INKEY$:IF Z$=""THEN 1380
- 1390 IF Z$="0"THEN DST=0:GOTO 1440
- 1400 IF Z$="1"THEN DST=1:GOTO 1440
- 1410 IF Z$="2"THEN DST=2:GOTO 1440
- 1420 GOTO 1380
- 1430 '
- 1440 'format screen
- 1450 CA=41:CB=55 'columns A & B
- 1460 VIEW PRINT 2 TO 24:CLS:VIEW PRINT:LOCATE 2
- 1470 PRINT UL$;
- 1480 COLOR 14,1
- 1490 LOCATE 2,CA:PRINT " SUNRISE "
- 1500 LOCATE 2,CB:PRINT " SUNSET "
- 1510 LOCATE 2,CB+13:PRINT " Daylight "
- 1520 COLOR 7,0
- 1530 PRINT " Local SOLAR Time.......................
- 1540 PRINT " Local STANDARD Time....................
- 1550 PRINT " Local DAYLIGHT SAVING Time.............
- 1560 PRINT " UNIVERSAL COORDINATED Time (UTC/GMT)...
- 1570 PRINT " Declination of Earth's axis............
- 1580 PRINT UL$;
- 1590 '
- 1600 '.....day of year
- 1610 K=INT((I+9)/12)
- 1620 X=H/4
- 1630 Y=INT(X)
- 1640 Z=X-Y
- 1650 IF Z=0 THEN 1670
- 1660 K=K*2
- 1670 H=INT(275*I/9)
- 1680 H=H+J-K-30
- 1690 '
- 1700 'SUNRISE ***********************************************************
- 1710 '.....rising phenomena
- 1720 I=0
- 1730 J=PI/2
- 1740 GOSUB 2570
- 1750 '
- 1760 '.....local solar time
- 1770 R=-0.0145439
- 1780 GOSUB 3030
- 1790 IF V<>0 THEN 1860
- 1800 IF SGN(LAT)=SGN(Q) THEN SUN$=" above "ELSE SUN$=" below "
- 1810 COLOR 14,1:LOCATE CSRLIN,13
- 1820 PRINT " The sun is";SUN$;"the horizon for 24 hours on this day. "
- 1830 COLOR 7,0
- 1840 GOTO 2510
- 1850 '
- 1860 SUNR=V+W/60 'sunrise - decimal hours
- 1870 LOCATE 3,CA+2:PRINT V$
- 1880 '
- 1890 '.....local standard time
- 1900 W$=V$:ADD=LST:GOSUB 4210
- 1910 LOCATE 4,CA+2:PRINT W$;AM$
- 1920 '
- 1930 '.....daylight saving time
- 1940 ADD=DST
- 1950 IF DST=0 THEN W$="N/A":GOTO 1970
- 1960 GOSUB 4210
- 1970 LOCATE 5,CA+2:PRINT W$;
- 1980 IF W$<>"N/A"THEN PRINT AM$ ELSE PRINT ""
- 1990 '
- 2000 '.....UTC
- 2010 V=U:FLAG=1:GOSUB 3290
- 2020 LOCATE 6,CA+2:PRINT V$;"z"
- 2030 '
- 2040 '.....declination
- 2050 DCL=Q*180/PI
- 2060 NOON=DCL
- 2070 LOCATE 7,CA+1:PRINT USING "+##.###";DCL;:PRINT "<UNK! {00F8}>"
- 2080 '
- 2090 '.....azimuth
- 2100 AZ=180-AZ
- 2110 AZ(1)=AZ
- 2120 '
- 2130 '.....SUNSET
- 2140 '.....setting phenomena
- 2150 I=1
- 2160 J=PI*1.5
- 2170 GOSUB 2570
- 2180 '
- 2190 '.....local solar time
- 2200 R=-0.0145439
- 2210 GOSUB 3030
- 2220 SUNS=V+W/60 'sunset - decimal hours
- 2230 LOCATE 3,CB+2:PRINT V$;SPC(7);USING "##.#";SUNS-SUNR;:PRINT " hrs."
- 2240 '
- 2250 '.....local standard time
- 2260 W$=V$:ADD=LST
- 2270 GOSUB 4210
- 2280 LOCATE 4,CB+2:PRINT W$;PM$
- 2290 '
- 2300 '.....daylight savings time
- 2310 ADD=DST
- 2320 IF ADD=0 THEN W$="N/A":GOTO 2340
- 2330 GOSUB 4210
- 2340 LOCATE 5,CB+2:PRINT W$;
- 2350 IF W$<>"N/A"THEN PRINT PM$ ELSE PRINT ""
- 2360 '
- 2370 '.....UTC
- 2380 V=U:FLAG=1:GOSUB 3290
- 2390 LOCATE 6,CB+2:PRINT V$;"z"
- 2400 '
- 2410 '.....declination
- 2420 DCL=Q*180/PI
- 2430 NOON=(NOON+DCL)/2 'approx declination at noon
- 2440 LOCATE 7,CB+1:PRINT USING "+##.###";DCL;:PRINT "<UNK! {00F8}>"
- 2450 '
- 2460 '.....azimuth
- 2470 AZ=180+AZ
- 2480 AZ(2)=AZ
- 2490 '
- 2500 GOSUB 3710 'draw radar screen
- 2510 GOTO 4350 'end
- 2520 END
- 2530 '
- 2540 '
- 2550 '.....SUB ROUTINES
- 2560 '
- 2570 '.....approximate time
- 2580 K=H+((J+LONG)/(PI*2))
- 2590 '
- 2600 '.....solar mean anomaly
- 2610 L=K*0.017202
- 2620 L=L-0.0574039
- 2630 '
- 2640 '.....solar true longitude
- 2650 Z=SIN(L)
- 2660 M=L+0.0334405*Z
- 2670 Z=SIN(2*L)
- 2680 M=M+0.000349065*Z
- 2690 M=M+4.93289
- 2700 '
- 2710 '.....quadrant determination
- 2720 Z=M
- 2730 GOSUB 3620
- 2740 M=Z
- 2750 X=M/(PI/2)
- 2760 Y=INT(X)
- 2770 Z=X-Y
- 2780 IF Z<>0 THEN 2800
- 2790 M=M+4.847E-06
- 2800 N=2
- 2810 IF M>(PI*1.5) THEN 2870
- 2820 N=1
- 2830 IF M>(PI/2) THEN 2870
- 2840 N=0
- 2850 '
- 2860 '.....solar right ascension
- 2870 P=0.91746*TAN(M)
- 2880 P=ATN(P)
- 2890 '
- 2900 '.....quadrant adjustment
- 2910 IF N=0 THEN 2980
- 2920 IF N=2 THEN 2950
- 2930 P=P+PI
- 2940 GOTO 2980
- 2950 P=P+PI*2
- 2960 '
- 2970 '.....solar declination
- 2980 Q=0.39782*SIN(M)
- 2990 Q=Q/SQR(-Q*Q+1)
- 3000 Q=ATN(Q)
- 3010 RETURN
- 3020 '
- 3030 '.....coordinate conversion
- 3040 S=R-(SIN(Q)*SIN(LAT))
- 3050 S=S/(COS(Q)*COS(LAT))
- 3060 '
- 3070 '.....null phenomenon
- 3080 Z=ABS(S)
- 3090 IF Z<=1 THEN 3130
- 3100 V=0
- 3110 RETURN
- 3120 '
- 3130 '.....adjustment
- 3140 S=S/SQR(-S*S+1)
- 3150 S=-ATN(S)+PI/2
- 3160 IF I=1 THEN 3190
- 3170 S=PI*2-S
- 3180 '
- 3190 '.....local apparent time
- 3200 Z=0.0172028*K
- 3210 T=S+P-Z-1.73364
- 3220 '
- 3230 '.....universal time
- 3240 U=T+LONG
- 3250 '
- 3260 '.....wall clock time
- 3270 V=U-ZONE
- 3280 '
- 3290 '.....decimal to sexagesimal
- 3300 Z=V
- 3310 GOSUB 3620
- 3320 Z=Z*3.81972
- 3330 IF FLAG=1 THEN FLAG=0:GOTO 3430
- 3340 '
- 3350 '.....azimuth
- 3360 HR=(12-Z)*15 'hour angle in degrees
- 3370 HRA=HR*PI/180 'hour angle in radians
- 3380 X=SIN(Q)*COS(LAT)-COS(Q)*SIN(LAT)*COS(HRA)
- 3390 ZA=ATN(X/SQR(-X*X+1))+PI/2 'azimuth in radians
- 3400 AZ=ZA*180/PI 'azimuth in degrees
- 3410 IF AZ<0 THEN AZ=AZ+360
- 3420 '
- 3430 V=INT(Z)
- 3440 W=(Z-V)*60
- 3450 X=INT(W)
- 3460 Y=W-X
- 3470 IF Y<0.5 THEN 3490
- 3480 X=X+1
- 3490 IF X<60 THEN 3530
- 3500 V=V+1
- 3510 X=0
- 3520 '
- 3530 '.....conventional format
- 3540 Z$="00"
- 3550 HR$=MID$(STR$(V),2)
- 3560 HR$=RIGHT$(Z$+HR$,2)
- 3570 MI$=MID$(STR$(X),2)
- 3580 MI$=RIGHT$(Z$+MI$,2)
- 3590 V$=HR$+":"+MI$
- 3600 RETURN
- 3610 '
- 3620 '.....normalization
- 3630 IF Z>=0 THEN 3660
- 3640 Z=Z+PI*2
- 3650 GOTO 3620
- 3660 IF Z<PI*2 THEN 3690
- 3670 Z=Z-PI*2
- 3680 GOTO 3660
- 3690 RETURN
- 3700 '
- 3710 '.....radar screen
- 3720 R=7 'radial
- 3730 H=R^2/2 '1/2 square of hypotenuse
- 3740 X=41 'x-axis
- 3750 Y=16 'y-axis
- 3760 XY=2.34375 'xy ratio
- 3770 FOR Z=Y-R TO Y+R
- 3780 LOCATE Z,X-18
- 3790 PRINT STRING$(37,"CSRLIN");
- 3800 IF Z<Y+R THEN PRINT ""
- 3810 NEXT Z
- 3820 COLOR 11,7
- 3830 FOR Z=Y-R TO Y+R:LOCATE Z,X:PRINT "CALL":NEXT Z
- 3840 FOR Z=X-18 TO X+18:LOCATE Y,Z:PRINT "SOUND":NEXT Z
- 3850 COLOR 15,3
- 3860 LOCATE Y-R,X-2:PRINT " N "
- 3870 LOCATE Y-SQR(H),X-(SQR(H)*XY)-1.5:PRINT " NW "
- 3880 LOCATE Y-SQR(H),X+(SQR(H)*XY)-1.5:PRINT " NE "
- 3890 LOCATE Y,X-(R*XY)-2:PRINT " W "
- 3900 COLOR 15,1
- 3910 LOCATE Y,X-4:PRINT " AZIMUTH "
- 3920 COLOR 15,3
- 3930 LOCATE Y,X+(R*XY)-2:PRINT " E "
- 3940 LOCATE Y+SQR(H),X-(SQR(H)*XY)-1.5:PRINT " SW "
- 3950 LOCATE Y+SQR(H),X+(SQR(H)*XY)-1.5:PRINT " SE "
- 3960 LOCATE Y+R,X-2:PRINT " S ";
- 3970 IF SGN(LAT)=-1 THEN A=10:B=22 ELSE A=22:B=10
- 3980 COLOR 14,7:LA=ABS(LAT*180/PI):EL=90-LA+NOON
- 3990 IF EL>90 THEN EL=180-EL:SWAP A,B
- 4000 LOCATE A,29
- 4010 PRINT "Elevation of Noon sun:";USING "###";EL;
- 4020 PRINT "<UNK! {00F8}>";
- 4030 COLOR 7,0
- 4040 '
- 4050 '....BRG = bearing
- 4060 FOR Z=1 TO 2
- 4070 BRG=AZ(Z)-90 'bearing in degrees
- 4080 HDG=BRG*PI/180 'bearing in radians
- 4090 YY=SIN(HDG)*R
- 4100 XX=CINT(COS(HDG)*R*XY)
- 4110 COLOR 14,1
- 4120 LOCATE Y+YY,X+XX-1
- 4130 PRINT " * ";
- 4140 COLOR 14,0
- 4150 IF Z=1 THEN LOCATE Y+YY,X+20:PRINT"SUNRISE @";USING "####";AZ(1);:PRINT "<UNK! {00F8}>"
- 4160 IF Z=2 THEN LOCATE Y+YY,X-32:PRINT"SUNSET @";USING "####";AZ(2);:PRINT "<UNK! {00F8}>"
- 4170 NEXT Z
- 4180 COLOR 7,0
- 4190 RETURN
- 4200 '
- 4210 '.....political time
- 4220 LT=VAL(LEFT$(W$,2)): RT=VAL(RIGHT$(W$,2))
- 4230 LT=LT+INT(ADD): RT=(RT+(ADD-INT(ADD))*60)
- 4240 IF RT>=60 THEN RT=60-RT:LT=LT+1
- 4250 IF LT=24 THEN LT=12:GOTO 4280
- 4260 IF LT>24 THEN LT=LT-12:PM$=AM$
- 4270 IF LT>12 THEN LT=LT-12
- 4280 LT$=STR$(LT): RT$=STR$(RT)
- 4290 LT$=RIGHT$(LT$,LEN(LT$)-1): RT$=RIGHT$(RT$,LEN(RT$)-1)
- 4300 IF LEN(LT$)<2 THEN LT$=" "+LT$:GOTO 4300
- 4310 IF LEN(RT$)<2 THEN RT$="0"+RT$:GOTO 4310
- 4320 W$=LT$+":"+RT$
- 4330 RETURN
- 4340 '
- 4350 '.....end
- 4360 GOSUB 4400
- 4370 GOTO 180 'start
- 4380 END
- 4390 '
- 4400 'HARDCOPY
- 4410 GOSUB 4520:LOCATE 25,2:COLOR 14,6
- 4420 PRINT " Press 1 to print screen, 2 to print screen & ";
- 4430 PRINT "advance paper, or 3 to continue.";:COLOR 7,0
- 4440 Z$=INKEY$:IF Z$="3"THEN GOSUB 4520:RETURN
- 4450 IF Z$="1"OR Z$="2"THEN GOSUB 4520:GOTO 4470
- 4460 GOTO 4440
- 4470 FOR QX=1 TO 24:FOR QY=1 TO 80
- 4480 LPRINT CHR$(SCREEN(QX,QY));
- 4490 NEXT QY:NEXT QX
- 4500 IF Z$="2"THEN LPRINT CHR$(12)
- 4510 GOTO 4410
- 4520 LOCATE 25,1:PRINT STRING$(80,32);:RETURN
-